//package org.jeecg.modules.ws.job;
//
//import cn.hutool.core.date.DateTime;
//import cn.hutool.core.date.DateUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import groovy.util.logging.Slf4j;
//import org.jeecg.modules.ws.entity.*;
//import org.jeecg.modules.ws.enums.NoticeTypeEnum;
//import org.jeecg.modules.ws.service.*;
//import org.jeecg.modules.ws.util.EmailSendUtil;
//import org.jeecg.modules.ws.vo.BankForewarnVo;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import java.math.BigDecimal;
//import java.time.ZoneId;
//import java.time.ZonedDateTime;
//import java.time.temporal.ChronoUnit;
//import java.util.Date;
//import java.util.List;
//
///**
// * 银行通知任务
// *
// * @author ZJJ
// * @date 2025-04-27 下午3:39
// * @copyright Copyright (c) 2025 ZJJ
// */
//@Slf4j
//@Component
//public class BankNoticeJob {
//    private static final Logger log = LoggerFactory.getLogger(BankNoticeJob.class);
//    @Autowired
//    private IWsBankForewarnService forewarnService;
//    @Autowired
//    private IWsBankInfoService infoService;
//    @Autowired
//    private IWsBankBlockTradeService blockTradeService;
//    @Autowired
//    private IWsBankDetailService detailService;
//    @Autowired
//    private EmailSendUtil emailSendUtil;
//    @Autowired
//    private IWsEmailAdminService emailsAdminService;
////    @Autowired
////    private IWsMessageNoticeService messageNoticeService;
//    private static final String FOREWARN_NOTICE = "01";
//    private static final String BLOCK_TRADE_NOTICE = "02";
//
//
//    /**
//     * 预警通知
//     */
//    @Scheduled(cron = "0 0 3 * * ?")
//    public void forewarnNoticeJob() {
//        log.info("开始执行预警通知任务");
//        List<BankForewarnVo> forewarnList = forewarnService.getForewarnList();
//        log.info("查询到{}条预警记录", forewarnList.size());
//
//        for (BankForewarnVo forewarnVo : forewarnList) {
//            try {
//                String bankNo = forewarnVo.getBankNo();
//                String balance = forewarnVo.getBalance();
//                String forewarnValue = forewarnVo.getForewarnValue();
//
//                log.info("开始处理账户[{}]的预警通知", bankNo);
//
//                // 获取需要发送的邮件
//                List<WsEmailAdmin> emailAdminList = emailsAdminService.getByNoticeType(FOREWARN_NOTICE);
//                if (emailAdminList.isEmpty()) {
//                    log.warn("未配置预警通知邮件接收人");
//                    continue;
//                }
//
//                boolean allSuccess = true;
//                for (WsEmailAdmin emailAdmin : emailAdminList) {
//                    try {
//                        String email = emailAdmin.getEmail();
//
//                        // 检查是否已通知
//                        LambdaQueryWrapper<WsMessageNotice> noticeWrapper = new LambdaQueryWrapper<>();
//                        noticeWrapper.eq(WsMessageNotice::getBizId, bankNo)
//                                   .eq(WsMessageNotice::getReceiverEmail, email)
//                                   .eq(WsMessageNotice::getNoticeType, NoticeTypeEnum.FOREWARN.getCode())
//                                   .eq(WsMessageNotice::getNoticeStatus, "1");
//
//                        if (messageNoticeService.count(noticeWrapper) > 0) {
//                            log.info("账户[{}]的预警已通知给接收人[{}]，跳过", bankNo, email);
//                            continue;
//                        }
//
//                        // 发送邮件
//                        log.info("发送预警通知邮件给：{}", email);
//                        String content = String.format("账户：%s，余额低于预警值\n预警值：%s\n当前余额：%s",
//                            bankNo,
//                            forewarnValue,
//                            balance);
//
//                        emailSendUtil.SendMsg(email, "预警通知", content);
//
//                        // 记录通知状态
//                        WsMessageNotice notice = new WsMessageNotice();
//                        notice.setBizId(bankNo);
//                        notice.setNoticeType(NoticeTypeEnum.FOREWARN.getCode());
//                        notice.setReceiverEmail(email);
//                        notice.setNoticeStatus("1");
//                        notice.setNoticeTime(new Date());
//                        notice.setContent(content);
//                        messageNoticeService.save(notice);
//
//                        log.info("账户[{}]的预警通知邮件发送成功，并记录通知状态", bankNo);
//                    } catch (Exception e) {
//                        log.error("账户[{}]的预警通知邮件发送失败：{}", bankNo, e.getMessage(), e);
//                        allSuccess = false;
//                    }
//                }
//
//                // 如果所有邮件都发送成功，更新预警记录的通知状态
//                if (allSuccess) {
//                    WsBankForewarn forewarn = forewarnService.getByBankNo(bankNo);
//                    if (forewarn != null) {
//                        forewarn.setForewarnNoticeStatus("1");
//                        forewarnService.updateById(forewarn);
//                        log.info("账户[{}]的预警通知状态已更新为已通知", bankNo);
//                    }
//                } else {
//                    log.warn("账户[{}]的预警通知部分失败，状态未更新", bankNo);
//                }
//            } catch (Exception e) {
//                log.error("处理账户[{}]的预警通知异常：{}", forewarnVo.getBankNo(), e.getMessage(), e);
//            }
//        }
//        log.info("预警通知任务执行完成");
//    }
//
//    /**
//     * 获取当前小时的开始时间
//     *
//     * @return 当前小时的开始时间
//     */
//    public Date beginOfHour() {
//        return Date.from(
//                ZonedDateTime.now(ZoneId.systemDefault())
//                        .truncatedTo(ChronoUnit.HOURS)
//                        .toInstant()
//        );
//    }
//
//    /**
//     * 大额交易通知(废弃)
//     */
//    @Deprecated
//    // @Scheduled(cron = "0 30 * * * ?")
//    public void blockTradeNoticeJobBak() {
//        // Date now = new Date();
//        Date beginTime = DateUtil.offsetHour(beginOfHour(), -1);
//        Date endTime = beginOfHour();
//        // 获取所有预警
//        List<WsBankForewarn> forewarnList = forewarnService.list();
//        for (WsBankForewarn forewarn : forewarnList) {
//            String bankNo = forewarn.getBankNo();
//            BigDecimal blockTrade = forewarn.getBlockTrade(); // 大额交易阈值
//            // 获取大额交易明细
//            List<WsBankDetail> detailList = detailService.getBlockTradeDetail(beginTime, endTime, blockTrade);
//            for (WsBankDetail detail : detailList) {
//                try {
//                    String targetNo = detail.getTargetNo();
//                    BigDecimal txnAmount = detail.getTxnAmount();
//                    Date txnTime = detail.getTxnTime();
//                    String incOrExp = detail.getIncOrExp();
//                    log.info("账户:{},有大额交易", bankNo);
//                    // 获取需要发送的邮件
//                    List<WsEmailAdmin> emailAdminList = emailsAdminService.getByNoticeType(BLOCK_TRADE_NOTICE);
//                    for (WsEmailAdmin emailAdmin : emailAdminList) {
//                        String email = emailAdmin.getEmail();
//                        // 发送邮件
//                        log.info("发送邮件给:{}", emailAdmin.getEmail());
//                        String content = "账户:" + bankNo + ",有大额交易;交易金额:" + txnAmount + ",交易时间:" + DateUtil.format(txnTime,"yyyy-MM-dd HH:mm:ss") + ",收支方向:" + incOrExp + ",对方账户:" + targetNo;
//                        emailSendUtil.SendMsg(email, "大额交易通知", content);
//                    }
//                }catch (Exception e){
//                    log.error("账户:{},发送大额交易通知异常:{}",bankNo, e.getMessage(),e);
//                }
//            }
//        }
//    }
//
//    /**
//     * 大额交易通知
//     */
//    @Scheduled(cron = "0 30 * * * ?")
//    public void blockTradeNoticeJob() {
//        log.info("开始执行大额交易通知任务");
//        Date beginTime = DateUtil.offsetHour(beginOfHour(), -1); // 上个小时开始时间
//        Date endTime = beginOfHour(); // 当前小时开始时间
//        log.info("查询时间范围：{} 至 {}", DateUtil.format(beginTime, "yyyy-MM-dd HH:mm:ss"), DateUtil.format(endTime, "yyyy-MM-dd HH:mm:ss"));
//
//        // 只查询未通知的大额交易
//        List<WsBankBlockTrade> blockTradeList = blockTradeService.getByTxnTimeAndNoticeStatus(beginTime, endTime, "0");
//        log.info("查询到{}条未通知的大额交易记录", blockTradeList.size());
//
//        for (WsBankBlockTrade detail : blockTradeList) {
//            try {
//                String bankNo = detail.getBankNo();
//                BigDecimal txnAmount = detail.getTxnAmount();
//                Date txnTime = detail.getTxnTime();
//                String incOrExp = detail.getIncOrExp();
//
//                log.info("开始处理账户[{}]的大额交易通知", bankNo);
//
//                // 获取需要发送的邮件
//                List<WsEmailAdmin> emailAdminList = emailsAdminService.getByNoticeType(BLOCK_TRADE_NOTICE);
//                if (emailAdminList.isEmpty()) {
//                    log.warn("未配置大额交易通知邮件接收人");
//                    continue;
//                }
//
//                boolean allSuccess = true;
//                for (WsEmailAdmin emailAdmin : emailAdminList) {
//                    try {
//                        String email = emailAdmin.getEmail();
//
//                        // 检查是否已通知
//                        LambdaQueryWrapper<WsMessageNotice> noticeWrapper = new LambdaQueryWrapper<>();
//                        noticeWrapper.eq(WsMessageNotice::getBizId, detail.getId())
//                                   .eq(WsMessageNotice::getReceiverEmail, email)
//                                   .eq(WsMessageNotice::getNoticeType, NoticeTypeEnum.BLOCK_TRADE.getCode())
//                                   .eq(WsMessageNotice::getNoticeStatus, "1");
//
//                        if (messageNoticeService.count(noticeWrapper) > 0) {
//                            log.info("账户[{}]的大额交易已通知给接收人[{}]，跳过", bankNo, email);
//                            continue;
//                        }
//
//                        // 发送邮件
//                        log.info("发送大额交易通知邮件给：{}", email);
//                        String content = String.format("账户：%s，有大额交易\n交易金额：%s\n交易时间：%s\n收支方向：%s",
//                            bankNo,
//                            txnAmount,
//                            DateUtil.format(txnTime, "yyyy-MM-dd HH:mm:ss"),
//                            "1".equals(incOrExp) ? "收入" : "支出");
//
//                        emailSendUtil.SendMsg(email, "大额交易通知", content);
//
//                        // 记录通知状态
//                        WsMessageNotice notice = new WsMessageNotice();
//                        notice.setBizId(detail.getId());
//                        notice.setNoticeType(NoticeTypeEnum.BLOCK_TRADE.getCode());
//                        notice.setReceiverEmail(email);
//                        notice.setNoticeStatus("1");
//                        notice.setNoticeTime(new Date());
//                        notice.setContent(content);
//                        messageNoticeService.save(notice);
//
//                        log.info("账户[{}]的大额交易通知邮件发送成功，并记录通知状态", bankNo);
//                    } catch (Exception e) {
//                        log.error("账户[{}]的大额交易通知邮件发送失败：{}", bankNo, e.getMessage(), e);
//                        allSuccess = false;
//                    }
//                }
//
//                // 如果所有邮件都发送成功，更新大额交易记录的通知状态
//                if (allSuccess) {
//                    detail.setNoticeStatus("1"); // 更新为已通知
//                    blockTradeService.updateById(detail);
//                    log.info("账户[{}]的大额交易通知状态已更新为已通知", bankNo);
//                } else {
//                    log.warn("账户[{}]的大额交易通知部分失败，状态未更新", bankNo);
//                }
//            } catch (Exception e) {
//                log.error("处理账户[{}]的大额交易通知异常：{}", detail.getBankNo(), e.getMessage(), e);
//            }
//        }
//        log.info("大额交易通知任务执行完成");
//    }
//}
